# 如果a+b+从= 1000 且a^2+b^2 = c^2(abc为自然数)，如何求出所有的abc可能的组合

# 第一步 分析需求
# 找出所有的满足 以上两个条件的a,b,c的组合

# 第二部 设计算法
# 枚举法
# 找到所有的a,b,c的组合，判断当前，你找到的组合中是否满足以上两个条件

# 第三步 代码实现
import time

# def sun():
#     start_time = time.time()
#     for a in range(1, 1001):
#         for b in range(0, 1001):
#             for c in range(0, 1001):
#                 if a + b + c == 1000 and a ** 2 + b ** 2 == c ** 2:
#                     print(f'找到组合{a},{b},{c}')
#
#
#     end_time = time.time()
#     print(f'程序执行的时间是{end_time - start_time}')

# 优化后
# def sun():
#     start_time = time.time()
#     for a in range(1, 1001):
#         for b in range(0, 1001):
#             c = 1000 - a - b
#             if a ** 2 + b ** 2 == c ** 2:
#                 print(f'找到组合{a},{b},{c}')
#
#     end_time = time.time()
#     print(f'程序执行的时间是{end_time - start_time}')
#
#
# if __name__ == '__main__':
#     sun()

# 时间频度（T） 根据算法的执行步骤来评测算法的好坏
#  1000 * 1000 *1000 * 3 ---> 时间频度
# 1000 * 1000 * 3

# 时间复杂度 随着问题数据规模增长算法的时间频度的增长趋势 记作 O  根据数据的数量：n
#  1000 * 1000 *1000 * 3 ---> O(n***3)
# 1000 * 1000 * 3 ---> O(n**2)

# lst = [1, 2, 3, 4, 6, 7, 10]  # 找到列表证出现10的位置
# for index in lst:
#     if lst[index] == 10:
#         print(index)
#         break

# lst的最优的时间复杂度:O(1)
# 最坏的时间复杂度：O(n)
# 平均时间复杂度：n*(n+1)/2n ===>O(n)


# 采用内置的timeit包里面的Timer类 评测list.dict的操作时间复杂度
# 向一个空的列表中添加0-1000的元素
import timeit

def list_append():
    lst = []
    for i in range(10000):
        lst.append(i)


if __name__ == '__main__':
    t = timeit.Timer('list_append()', globals={'list_append': list_append})
    print(f'{list_append.__name__}函数运行时间为：{t.timeit(1000)}秒')
